package net.jgrm.common.util;

import java.security.MessageDigest;

/**
 * MD5工具类
 *
 * @author service-common
 */
public class MD5Util {

    /**
     * 私有构造函数
     */
    private MD5Util() {
        // 工具类不允许实例化
    }

    /**
     * 获取指定字符串的MD5值
     *
     * @param dataStr 明文
     * @return MD5加密后的字符串
     */
    public static String md5(String dataStr) {
        if (dataStr == null) {
            return null;
        }
        try {
            MessageDigest m = MessageDigest.getInstance("MD5");
            m.update(dataStr.getBytes("UTF-8"));
            byte[] s = m.digest();
            StringBuilder result = new StringBuilder();
            for (byte b : s) {
                result.append(Integer.toHexString((0x000000FF & b) | 0xFFFFFF00).substring(6));
            }
            return result.toString();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }

    /**
     * 获取指定字符串的MD5值，加盐处理
     *
     * @param dataStr 明文
     * @param salt    盐值
     * @return MD5加密后的字符串
     */
    public static String md5WithSalt(String dataStr, String salt) {
        if (dataStr == null) {
            return null;
        }
        return md5(dataStr + (salt != null ? salt : ""));
    }

    /**
     * 验证MD5值
     *
     * @param plainText 明文
     * @param md5Value  待验证的MD5值
     * @return true:验证通过 false:验证失败
     */
    public static boolean verify(String plainText, String md5Value) {
        String md5 = md5(plainText);
        return md5 != null && md5.equals(md5Value);
    }

    /**
     * 验证MD5值（带盐）
     *
     * @param plainText 明文
     * @param salt      盐值
     * @param md5Value  待验证的MD5值
     * @return true:验证通过 false:验证失败
     */
    public static boolean verifyWithSalt(String plainText, String salt, String md5Value) {
        String md5 = md5WithSalt(plainText, salt);
        return md5 != null && md5.equals(md5Value);
    }
}